package controller;
  
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List; 
import java.util.Set;

import org.hibernate.HibernateException;
import org.hibernate.Session;

import model.KlsConductor;
import model.KlsEstadoVehiculo;
import model.KlsUsuario;
import model.KlsVehiculo;
import model.KlsZonaEntrega;
import util.HibernateUtil;

 
public class KlsVehiculoManager extends HibernateUtil {
	
	private KlsEstadoVehiculo klsEstadoVehiculo;
	private KlsConductor klsConductor;
	private KlsUsuario klsUsuario;
	private KlsZonaEntrega klsZonaEntrega;
	
	
 
    public KlsVehiculo add(KlsVehiculo vehiculo, int piConductor, int idUsuario, int idZonaEntrega, int idEstadoVehiculo) {
        
    	cargarObjetosRelacionados(piConductor,idUsuario, idZonaEntrega, idEstadoVehiculo);
    	
    	vehiculo.setKlsConductor(klsConductor);
    	vehiculo.setKlsUsuarioByIdUsuarioCreador(klsUsuario);
    	vehiculo.setKlsUsuarioByIdUsuarioModificador(klsUsuario);
    	vehiculo.setKlsZonaEntrega(klsZonaEntrega);
    	
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.save(vehiculo);
        session.getTransaction().commit();
        return vehiculo;
    }

    
    public KlsVehiculo delete(int id) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        KlsVehiculo vehiculo = (KlsVehiculo) session.get(KlsVehiculo.class, id);
        if(null != vehiculo) {
            session.delete(vehiculo);
        }
        session.getTransaction().commit();
        return vehiculo;
    }
    
    
    public KlsVehiculo load(int idVehiculo) {
    	
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        KlsVehiculo vehiculo = (KlsVehiculo) session.get(KlsVehiculo.class, idVehiculo);
        session.getTransaction().commit();
        return vehiculo;
        
    }


    public KlsVehiculo update (KlsVehiculo vehiculo, int piConductor, int idUsuario, int idZonaEntrega, int idEstadoVehiculo) {
    	
    	cargarObjetosRelacionados(piConductor,idUsuario, idZonaEntrega, idEstadoVehiculo);
    	
    	vehiculo.setKlsEstadoVehiculo(klsEstadoVehiculo);
    	vehiculo.setKlsConductor(klsConductor);
    	vehiculo.setKlsUsuarioByIdUsuarioCreador(klsUsuario);
    	vehiculo.setKlsUsuarioByIdUsuarioModificador(klsUsuario);
    	vehiculo.setKlsZonaEntrega(klsZonaEntrega);
    	
    	
    	Session session = getSessionFactory().getCurrentSession();
        session.getTransaction().begin();
    	
    	try {
           	session.update(vehiculo);
        }
    	catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        session.getTransaction().commit();
        return vehiculo;
   }
    
        
    public String getZonaDelVEhiculo(int piVehiculo)
    {
    	String zona;
    	
    	String query = "select vehiculo.klsZonaEntrega.nombre from model.KlsVehiculo as vehiculo where vehiculo.idVehiculo ="+piVehiculo;
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	zona = session.createQuery(query).uniqueResult().toString();
    	session.getTransaction().commit();
    	return zona;
    }
    
   
	
	
	public  List<KlsVehiculo> list() {
        
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<KlsVehiculo> vehiculo = null;
        try {
             
        	vehiculo = session.createQuery("from KlsVehiculo").list();
        } 
        catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        
        }
        session.getTransaction().commit();
        return vehiculo;
    }
    
	public  List<KlsVehiculo> listPorEstado(int piEstado) {
        
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<KlsVehiculo> vehiculo = null;
        try {
             
        	vehiculo = session.createQuery("select vehiculo from model.KlsVehiculo as vehiculo where vehiculo.klsEstadoVehiculo.idEstadoVehiculo = "+piEstado).list();
        	session.getTransaction().commit();
     
        
        } 
        catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        
        }

        return vehiculo;
    }
	

	private void cargarObjetosRelacionados(int piConductor,	int idUsuario, int idZonaEntrega, int idEstadoVehiculo) {
		//Managers para cargar objetos
		 KlsZonaManager klsZonaManager = new KlsZonaManager();
		 KlsEstadoVehiculoManager klsEstadoVehiculoManager = new KlsEstadoVehiculoManager();
		 KlsUsuarioManager klsUsuarioManager = new KlsUsuarioManager();
		 KlsConductorManager klsConductorManager = new KlsConductorManager(); 
		 
		//Cargar objetos relacionados
		setKlsEstadoVehiculo(klsEstadoVehiculoManager.load(idEstadoVehiculo));
	    setKlsZonaEntrega(klsZonaManager.load(idZonaEntrega));
	    setKlsUsuario(klsUsuarioManager.load(idUsuario));  
	    setKlsConductor(klsConductorManager.load(piConductor));

	}


	/**
	 * @return the klsConductor
	 */
	public KlsConductor getKlsConductor() {
		return klsConductor;
	}


	/**
	 * @param klsConductor the klsConductor to set
	 */
	public void setKlsConductor(KlsConductor klsConductor) {
		this.klsConductor = klsConductor;
	}


	/**
	 * @return the klsUsuario
	 */
	public KlsUsuario getKlsUsuario() {
		return klsUsuario;
	}


	/**
	 * @param klsUsuario the klsUsuario to set
	 */
	public void setKlsUsuario(KlsUsuario klsUsuario) {
		this.klsUsuario = klsUsuario;
	}


	/**
	 * @return the klsZonaEntrega
	 */
	public KlsZonaEntrega getKlsZonaEntrega() {
		return klsZonaEntrega;
	}


	/**
	 * @param klsZonaEntrega the klsZonaEntrega to set
	 */
	public void setKlsZonaEntrega(KlsZonaEntrega klsZonaEntrega) {
		this.klsZonaEntrega = klsZonaEntrega;
	}


	/**
	 * @return the klsEstadoVehiculo
	 */
	public KlsEstadoVehiculo getKlsEstadoVehiculo() {
		return klsEstadoVehiculo;
	}


	/**
	 * @param klsEstadoVehiculo the klsEstadoVehiculo to set
	 */
	public void setKlsEstadoVehiculo(KlsEstadoVehiculo klsEstadoVehiculo) {
		this.klsEstadoVehiculo = klsEstadoVehiculo;
	}

    
	
}